完全二叉树和满二叉树的区别+完全二叉树求节点问题

今天复习了下二叉树的相关知识,发现很多都忘掉了,所以在此记录下

满二叉树


如图,顾名思义,满二叉树说白了其实就是除了最后一层,所有节点都有两个孩子,
所以:
假设现在有一棵深度为N的满二叉树:
总结点数就是2^N-1(计算公式:2^0 + 2^1 +…+2^(N-1))
叶子节点数就是2^(N-1)(上图中叶子节点也就是第三层的节点数位2^2 = 4)

完全二叉树


如图,完全二叉树就是除了最后一排,其余的都是满二叉树,最后一排的节点都连续靠左。
所以:
如果给定了一个完全二叉树的总结点数,那么对应应该可以求出他的叶子节点数已经深度。
例如:总结点数位770,求叶子节点

方法一:(详细步骤)

如下:
2^9 - 1 = 511 < 770
2^10 - 1 = 1023 >770
所以 这个完全二叉树一共有10层;前9层总结点是511,所以第10层的叶子节点为770 - 511 = 259,
*特别注意*
因为最后一层不是满的,所以倒数第二层也露出了一些节点,那些节点也算是叶子节点!
第9层总结点数为 2*(9-1) = 256,
第10层一共259个叶子节点,他们的父节点是在第9层的,也就是round(259/2)(向上取整 = 130)这么多个第9层节点延伸下来的,也就是第9层这些节点是有孩子的,剩下的256 - 130 = 126没有孩子,也是算叶子节点的。
所以总共 126 + 259 = 385个叶子节点。

方法二(简便算法)

如下:
首先了解下定义:
有两个子节点的节点叫做度数为2的节点,这里称作D2
有一个子节点的节点叫做度数为1的节点,这里称作D1
有0个子节点的节点叫做度数为0的节点,这里称作D0(叶子节点)
于是:
总节点数=D2 + D1 + D0
另外:
D2它会产生两个新节点,D1产生一个新节点,还有一个根节点本身就存在
所以总结点数 = D2 * 2 + D1 * 1 + 1
联合两个方程得到:
D2 + 1 = D0
也就是度数为0的节点数总是比度数为2的节点数多1个
了解这一点很重要!!!

好了,下面开始简单运算过程:
假设总结点数为N,那么就有:
N = D2 + D1 + D0
又因为之前上面提到 D2 + 1 = D0,所以
N = D0 - 1 + D1 + D0
N = 2D0 + D1 - 1

注意:充分了解完全二叉树的定义可知,度为1的节点只有可能为0或者1
所以,D1 = 1 OR 0,两种情况都带入
D1 = 0时:
N = 2D0 - 1
D0 = (N + 1) / 2
D1 = 1时:
N = 2D0
D0 = N / 2
D0是个整数,所以D0 = N / 2(向上取整)

总结:
叶子节点数 = 总结点数 / 2 (向上取整)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值